package com.atguigu.gulimall.order;

import com.alibaba.cloud.seata.GlobalTransactionAutoConfiguration;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 使用RabbitMQ
 *  1、引入amqp场景启动器;RabbitAutoConfiguration就会自动生效
 *  2、给容器中自动配置了RabbitTemplate、AmqpAdmin、CachingConnectionFactory、RabbitMessagingTemplate
 *            所有的属性都是在这绑定的：spring.rabbitmq
 *            @ConfigurationProperties(prefix = "spring.rabbitmq")
 *            public class RabbitProperties {}
 *  3、给配置文件中配置 spring.rabbitmq 信息
 *  4、@EnableRabbit 开启功能
 *  5、监听消息：使用@RabbitListener：必须开启@EnableRabbit
 *      @RabbitListener： 类+方法上（监听哪些队列即可）
 *      @RabbitHandler: 标在方法上(重载区分不同的消息)
 *  6、Seata控制分布式事务
 *      1）、每一个微服务先必须创建ubdo_log回滚日志表；
 *      2）、安装事务协调器：seata-server: https://github.com/seata/seata/releases
 *      3）、整合
 *          1、导入依赖 :spring-cloud-starter-alibaba-seata seata-all-0.7.1
 *          2、解压启动seata-server;
 *              registry.conf ：注册中心配置 修改它： registry type = "nacos"
 *              file.conf：
 *          3、所有想用到分布式事务的微服务 使用 seata DataSourceProxy代理自己的数据源
 *          4、每个微服务都必须要导入
 *                  registry.conf
 *                  file.conf   vgroup_mapping.{application.name}-fescar-service-group = "default"
 *          5、给分布式大事务的入口标注： @GlobalTransactional
 *          6、每一个小事务标注： @Transactional
 */
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication(exclude = GlobalTransactionAutoConfiguration.class)
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
